/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package BancoDados;

import Sistema.Defs;
import Utilidades.UtilityDB;
import Utilidades.UtilityTime;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;

/**
 * Created on : May 21, 2011, 5:46:24 PM
 * @author diogo
 *
 * SQL:
 * CREATE TABLE Solicitacao (
  CodSolicitacao         BIGSERIAL NOT NULL,
  ClienteCodCliente     int8 NOT NULL,
  ProfissaoCodProfissao int4 NOT NULL,
  Qtde                  int4,
  DataSolicitacao       date,
  DataAtendimento       date,
  PRIMARY KEY (CodSolicitacao));
 */
public class Solicitacao extends Dado implements Entidade{

	@Override
	public String getTableName() {
		return "Solicitacao";
	}

	@Override
	public String[] getPrimaryKey() {
		return new String[]{
					"CodSolicitacao"
				};
	}

	@Override
	public String[] getColumns() {
		return new String[]{
					"ClienteCodCliente",
					"ProfissaoCodProfissao",
					"Qtde",
					"DataSolicitacao",
					"DataAtendimento"
				};
	}

	public static boolean Inserir(
			int ClienteCodCliente,
			int ProfissaoCodProfissao,
			int Qtde,
			Date DataSolicitacao,
			Date DataAtendimento
			) {


		Solicitacao s = new Solicitacao();
		String[] colunas = s.getColumns();
		int x = 0;

		String SQL = UtilityDB.CreateInsert(s.getTableName(),
				colunas[x++], ClienteCodCliente,
				colunas[x++], ProfissaoCodProfissao,
				colunas[x++], Qtde,
				colunas[x++], DataSolicitacao,
				colunas[x++], DataAtendimento
				);

		int linhasAfetadas = c.cadastrar(SQL);
		return linhasAfetadas > 0;
	}

	public static boolean Inserir(HttpServletRequest request) {
		String[] colunas = new Solicitacao().getColumns();
		int x = 0;


		String DataValor = "";

		int ClienteCodCliente = Integer.parseInt(request.getParameter(colunas[x++]));
		int ProfissaoCodProfissao = Integer.parseInt(request.getParameter(colunas[x++]));
		int Qtde = Integer.parseInt(request.getParameter(colunas[x++]));
		
		Date DataSolicitacao = new Date();
//		Date DataSolicitacao = UtilityTime.ToDate(request.getParameter(colunas[x++]), Defs.divisorData);
		Date DataAtendimento = null;
		if (DataValor != null) {
			DataAtendimento = UtilityTime.ToDate(DataValor, Defs.divisorData);
		}

		return Inserir(ClienteCodCliente, ProfissaoCodProfissao, Qtde, DataSolicitacao, DataAtendimento);
	}


	public static ResultSet Listar(int CodCliente, boolean atendido){
		ResultSet rs = null;

		String SQL = UtilityDB.CallFunction("fn_lista_solicitacoes",CodCliente,atendido);
		
		// gamb - ordena pelo mais recemte
		if (atendido) {
			SQL += "order by datasolicitacao desc";
		}
		try {
			rs = c.consultar(SQL);
		} catch (SQLException ex) {
			Logger.getLogger(Solicitacao.class.getName()).log(Level.SEVERE, null, ex);
		}
		return rs;
	}


	/**
	 * fn_inserir_solicitacao(codSolicitacao int, indicacoes integer[] )
	 * @param codSolicitacao o codigo da solicitacao
	 * @param indicacoes array com os codigos de profissionais indicados
	 * @return int.
	 */
	public static int ContratarProfissionais(int codSolicitacao, int[] indicacoes){
		try {
			ResultSet rs = null;
			//String SQL = "select * from testWARNING()";
			String SQL = UtilityDB.CallFunction("fn_inserir_solicitacao", codSolicitacao, indicacoes);
			System.out.println("SQL Q VAI EXECUTA HAHAHHAHAA" + SQL);
			//*
			rs = c.consultar(SQL);
			rs.next();
			return rs.getInt(1);
			//*/
		} catch (Exception e) {
			return 0;
			//Logger.getLogger(Solicitacao.class.getName()).log(Level.SEVERE, null, ex);

		}
	}


	/**
--- Funcao para atualizar o nivel de Especializacao de um profissional
-- @param int - Codigo Solicitacao
-- @param int - Codigo Profissional
-- @param int - nivel a setar.
-- @return int - o novo nivel
	 */
	public static boolean  AtualizaNivel(int CodSolicitacao, int CodProfissional, int novoNivel){
		//fn_atualizaNivel
		ResultSet rs = null;
		boolean resultado = false;
		String SQL = UtilityDB.CallFunction("fn_atualizaNivelContrato", CodSolicitacao, CodProfissional, novoNivel);
		try {
			rs = c.consultar(SQL);
			rs.next();
			resultado = rs.getBoolean(1);
		} catch (SQLException ex) {
			Logger.getLogger(Profissional.class.getName()).log(Level.SEVERE, null, ex);
		}
		return resultado;
	}

	public static ResultSet ListaProfissionais(int CodSolicitacao, int CodCliente){
		// fn_filtra_cliente_profissional
		ResultSet rs = null;

		String SQL = UtilityDB.CallFunction("fn_filtra_cliente_profissional",CodSolicitacao, CodCliente);

		// gamb - ordena pelo mais recemte
		try {
			rs = c.consultar(SQL);
		} catch (SQLException ex) {
			Logger.getLogger(Solicitacao.class.getName()).log(Level.SEVERE, null, ex);
		}
		return rs;
	}
}
